package cn.itrip.auth.controller;

import cn.itrip.auth.service.TokenService;
import cn.itrip.auth.service.UserService;
import cn.itrip.beans.dto.Dto;
import cn.itrip.beans.pojo.ItripUser;
import cn.itrip.beans.vo.ItripTokenVO;
import cn.itrip.common.DtoUtil;
import cn.itrip.common.EmptyUtils;
import cn.itrip.common.ErrorCode;
import cn.itrip.common.MD5;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Calendar;

/** 
* @Description: 用户登录控制器
* @Author: XiaoKun
* @Date: 2019-01-26 
*/ 
@Api(tags = "用户登录接口")
@Controller
@RequestMapping(value = "/api")
public class LoginController {

    @Resource
    private UserService userService;

    @Resource
    private TokenService tokenService;

    @RequestMapping(value = "/dologin", method = RequestMethod.POST, produces = "application/json")
    @ApiOperation(value = "用户登录")
    public @ResponseBody
    Dto dologin(@ApiParam(required = true, value = "用户名")
                @RequestParam
                        String name,
                @ApiParam(required = true, value = "用户密码")
                @RequestParam
                        String password,
                HttpServletRequest request) {
        try {
            ItripUser user = userService.login(name, MD5.getMd5(password, 32));
            if (EmptyUtils.isNotEmpty(user)) {
                String userAgent = request.getHeader("user-agent");
                String token = tokenService.geterateToken(userAgent, user);
                tokenService.save(token, user);
                ItripTokenVO vo = new ItripTokenVO(token, Calendar.getInstance().getTimeInMillis() + 2 * 60 * 60 * 1000, Calendar.getInstance().getTimeInMillis());
                return DtoUtil.returnDataSuccess(vo);
            } else {
                return DtoUtil.returnFail("用户名或密码错误", ErrorCode.AUTH_AUTHENTICATION_FAILED);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return DtoUtil.returnFail(e.getMessage(), ErrorCode.AUTH_AUTHENTICATION_FAILED);
        }
    }

    @ApiOperation(value = "用户注销")
    @ApiImplicitParam(value = "token", name = "token", paramType = "header")
    @RequestMapping(value = "/logout", method = RequestMethod.GET, produces = "application/json", headers = "token")
    public @ResponseBody
    Dto logout(HttpServletRequest request) {
        String token = request.getHeader("token");
        try {
            String useragent = "user-agent";
            if (tokenService.validate(request.getHeader(useragent), token)) {
                tokenService.delToken(token);
                return DtoUtil.returnSuccess("注销成功！");
            } else {
                return DtoUtil.returnFail("token无效", ErrorCode.AUTH_TOKEN_INVALID);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return DtoUtil.returnFail("退出失败！", ErrorCode.AUTH_TOKEN_INVALID);
        }
    }
}
